package validator

import (
	"fmt"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zh_translations "github.com/go-playground/validator/v10/translations/zh"
	"go.uber.org/zap"
	. "go_tempate/common/validator/customValidator"
)

// 声明本次全局的验证结构体
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
var Validator *validator.Validate // 验证器

var Trans ut.Translator // 翻译器

func init() {
	// 中文翻译器
	//----------------------------------------------------------------------------------------------------------
	uni := ut.New(zh.New())
	trans, _ := uni.GetTranslator("zh")

	//初始化此结构体
	//----------------------------------------------------------------------------------------------------------
	Validator = validator.New()

	// 注册翻译器到校验器
	//----------------------------------------------------------------------------------------------------------
	err := zh_translations.RegisterDefaultTranslations(Validator, trans)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 同步翻译器
	//----------------------------------------------------------------------------------------------------------
	Trans = trans

	//循环自定义验证成员列表
	//----------------------------------------------------------------------------------------------------------
	for _, v := range CustomValidatorList {
		//注册自定义验证类型
		_ = Validator.RegisterValidation(v.Name, v.Fun)
	}

}

/*
  抛出错误验证函数

  作用:
   可以选用进行对错误的统一化处理逻辑，返回当前的错误方便自定义操作

  参数:
    当前需要验证的结构体

  返回:
    错误信息
*/
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func ValidatorVerify(obj interface{}) error {
	errs := Validator.Struct(obj) // 解析当前内容是否符合规范

	//如果发生错误
	//----------------------------------------------------------------------------------------------------------
	if errs != nil {
		//循环遍历出对应的错误信息
		for _, err := range errs.(validator.ValidationErrors) {
			fmt.Println("验证错误：", err.Error())
			zap.S().Errorf("Validator规则验证报错：%v", err.Error())
		}
	}

	//返回此时错误的内容
	//----------------------------------------------------------------------------------------------------------
	return errs
}
